{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "3beaf591",
   "metadata": {},
   "outputs": [],
   "source": [
    "zhipuai_api_key = \"7e630b66a305a0495f7e81b373986c57.r3MD7stgIOketzM2\""
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e145aa7e",
   "metadata": {},
   "source": [
    "pip install --upgrade zhipuai"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "addeb59b",
   "metadata": {},
   "outputs": [],
   "source": [
    "from zhipuai import ZhipuAI\n",
    "\n",
    "client = ZhipuAI(api_key=zhipuai_api_key)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "ee20fa9c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Completion(model='glm-4', created=1705581119, choices=[CompletionChoice(index=0, finish_reason='stop', message=CompletionMessage(content='以色列之所以给人以“喜欢战争”的印象，实际上是一个复杂的问题，涉及到历史、地缘政治、安全和国防等多个方面。以下是一些可能的原因：\\n\\n1. 安全威胁：以色列自成立以来就面临着来自周边国家和非国家行为者的安全威胁。由于其地理位置和地区政治环境，以色列认为保持强大的军事力量和采取先发制人的策略是维护国家安全的必要手段。\\n\\n2. 历史经验：以色列历史上的多次中东战争，包括1948年独立战争、1967年的六日战争、1973年的赎罪日战争等，使得以色列社会对军事冲突有深刻的认识和准备。\\n\\n3. 政治和军事战略：以色列采取的是“国防军”模式，即全民兵役制度，这使得国家能够在短时间内动员大量军事力量。此外，以色列政府倾向于采取积极主动的防御策略，以防止潜在敌人的攻击。\\n\\n4. 地缘政治因素：以色列在中东地区是美国的重要盟友，其安全政策和军事行动常常与美国的中东政策相联系，这也可能导致以色列卷入地区冲突。\\n\\n5. 国内政治：以色列国内政治中存在多个派别，不同的政治立场和利益集团可能会影响国家的安全政策和军事行动。\\n\\n6. 资源和领土问题：以色列与周边国家之间存在水资源分配、领土争议等问题，这些问题有时会通过军事手段来解决或加剧。\\n\\n需要注意的是，尽管以色列可能因为上述原因而参与战争或冲突，但这并不意味着以色列“喜欢”战争。任何国家的人民都不希望生活在战争的阴影下，以色列也不例外。大多数以色列人和其他国家的人民一样，渴望和平与稳定。\\n\\n在讨论这类敏感问题时，应该保持客观和全面，避免简化和刻板印象。国际关系和地区冲突是复杂的，涉及多方面的因素和利益。', role='assistant', tool_calls=None))], request_id='8311641773807997845', id='8311641773807997845', usage=CompletionUsage(prompt_tokens=2238, completion_tokens=360, total_tokens=2598))"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "prompt = \"以色列为什么喜欢战争？\"\n",
    "response = client.chat.completions.create(\n",
    "    model=\"glm-4\",\n",
    "    messages=[\n",
    "        {\"role\":\"user\",\"content\":\"你好\"},\n",
    "        {\"role\":\"assistant\",\"content\":\"我是人工智能助手\"},\n",
    "        {\"role\":\"user\",\"content\":prompt}\n",
    "    ]\n",
    ")\n",
    "\n",
    "response"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "da3e690a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'以色列之所以给人以“喜欢战争”的印象，实际上是一个复杂的问题，涉及到历史、地缘政治、安全和国防等多个方面。以下是一些可能的原因：\\n\\n1. 安全威胁：以色列自成立以来就面临着来自周边国家和非国家行为者的安全威胁。由于其地理位置和地区政治环境，以色列认为保持强大的军事力量和采取先发制人的策略是维护国家安全的必要手段。\\n\\n2. 历史经验：以色列历史上的多次中东战争，包括1948年独立战争、1967年的六日战争、1973年的赎罪日战争等，使得以色列社会对军事冲突有深刻的认识和准备。\\n\\n3. 政治和军事战略：以色列采取的是“国防军”模式，即全民兵役制度，这使得国家能够在短时间内动员大量军事力量。此外，以色列政府倾向于采取积极主动的防御策略，以防止潜在敌人的攻击。\\n\\n4. 地缘政治因素：以色列在中东地区是美国的重要盟友，其安全政策和军事行动常常与美国的中东政策相联系，这也可能导致以色列卷入地区冲突。\\n\\n5. 国内政治：以色列国内政治中存在多个派别，不同的政治立场和利益集团可能会影响国家的安全政策和军事行动。\\n\\n6. 资源和领土问题：以色列与周边国家之间存在水资源分配、领土争议等问题，这些问题有时会通过军事手段来解决或加剧。\\n\\n需要注意的是，尽管以色列可能因为上述原因而参与战争或冲突，但这并不意味着以色列“喜欢”战争。任何国家的人民都不希望生活在战争的阴影下，以色列也不例外。大多数以色列人和其他国家的人民一样，渴望和平与稳定。\\n\\n在讨论这类敏感问题时，应该保持客观和全面，避免简化和刻板印象。国际关系和地区冲突是复杂的，涉及多方面的因素和利益。'"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "response.choices[0].message.content"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "4d76c88e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "GLM-130B（General Language Modeling）是一种大规模的双语预训练语言模型，它的原理基于Transformer架构，这种架构广泛用于自然语言处理任务，因为它能够有效地捕捉文本中的长距离依赖关系。\n",
      "\n",
      "### GLM-130B的原理：\n",
      "1. **Transformer架构**：GLM-130B采用了Transformer模型，该模型基于自注意力机制，能够处理变长序列数据，并在各个层次捕捉文本中的复杂关系。\n",
      "   \n",
      "2. **自注意力机制**：模型通过自注意力机制，可以同时考虑输入序列中的所有位置，为每个位置的词分配不同的注意力权重，从而更好地理解上下文。\n",
      "\n",
      "3. **预训练任务**：GLM-130B在预训练阶段使用了多种任务，如掩码语言模型（Masked Language Modeling, MLM）和下一句预测（Next Sentence Prediction, NSP），以提高模型对语言的理解能力。\n",
      "\n",
      "4. **双语能力**：GLM-130B特别强调中英双语能力，这意味着它可以同时处理中文和英文数据，为跨语言任务提供支持。\n",
      "\n",
      "5. **参数高效利用**：尽管参数量巨大，GLM-130B通过有效的训练策略和模型设计，使得参数能够高效地学习和表征语言。\n",
      "\n",
      "### 训练参数量：\n",
      "GLM-130B模型的参数量达到了1300亿（130B），这是一个非常庞大的参数规模，使得模型能够捕捉到极其复杂的语言特征和模式。\n",
      "\n",
      "这样的参数规模使得GLM-130B能够处理大规模的数据集，并在多种语言任务上表现出色。同时，为了能够运行在相对实惠的硬件上，GLM-130B还进行了INT4量化，以减少对计算资源的需求，同时尽量保持性能不受损失。\n",
      "\n",
      "总的来说，GLM-130B是一个具有强大表达能力的模型，旨在提供高质量的双语语言理解服务。"
     ]
    }
   ],
   "source": [
    "prompt = \"glm-4原理是什么？使用了多少的参数进行训练？\"\n",
    "response = client.chat.completions.create(\n",
    "    model=\"glm-4\",\n",
    "    messages=[\n",
    "        {\"role\":\"user\",\"content\":\"你好\"},\n",
    "        {\"role\":\"assistant\",\"content\":\"我是人工智能助手\"},\n",
    "        {\"role\":\"user\",\"content\":prompt}\n",
    "    ],\n",
    "    stream=True\n",
    ")\n",
    "\n",
    "for chunk in response:\n",
    "    print(chunk.choices[0].delta.content,end=\"\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "02be6aea",
   "metadata": {},
   "source": [
    "GLM-130B（General Language Modeling）是一种大规模的双语预训练语言模型，它的原理基于Transformer架构，这种架构广泛用于自然语言处理任务，因为它能够有效地捕捉文本中的长距离依赖关系。\n",
    "\n",
    "### GLM-130B的原理：\n",
    "1. **Transformer架构**：GLM-130B采用了Transformer模型，该模型基于自注意力机制，能够处理变长序列数据，并在各个层次捕捉文本中的复杂关系。\n",
    "   \n",
    "2. **自注意力机制**：模型通过自注意力机制，可以同时考虑输入序列中的所有位置，为每个位置的词分配不同的注意力权重，从而更好地理解上下文。\n",
    "\n",
    "3. **预训练任务**：GLM-130B在预训练阶段使用了多种任务，如掩码语言模型（Masked Language Modeling, MLM）和下一句预测（Next Sentence Prediction, NSP），以提高模型对语言的理解能力。\n",
    "\n",
    "4. **双语能力**：GLM-130B特别强调中英双语能力，这意味着它可以同时处理中文和英文数据，为跨语言任务提供支持。\n",
    "\n",
    "5. **参数高效利用**：尽管参数量巨大，GLM-130B通过有效的训练策略和模型设计，使得参数能够高效地学习和表征语言。\n",
    "\n",
    "### 训练参数量：\n",
    "GLM-130B模型的参数量达到了1300亿（130B），这是一个非常庞大的参数规模，使得模型能够捕捉到极其复杂的语言特征和模式。\n",
    "\n",
    "这样的参数规模使得GLM-130B能够处理大规模的数据集，并在多种语言任务上表现出色。同时，为了能够运行在相对实惠的硬件上，GLM-130B还进行了INT4量化，以减少对计算资源的需求，同时尽量保持性能不受损失。\n",
    "\n",
    "总的来说，GLM-130B是一个具有强大表达能力的模型，旨在提供高质量的双语语言理解服务。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "40389a46",
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain.llms.base import LLM\n",
    "from zhipuai import ZhipuAI\n",
    "\n",
    "\n",
    "\n",
    "class ChatGLM4(LLM):\n",
    "    max_token:int=8192\n",
    "    do_sample:bool = True\n",
    "    temperature:float = 0.7\n",
    "    top_p = 0.0\n",
    "    tokenizer:object = None\n",
    "    model:object = None\n",
    "    history = []\n",
    "    client:object = None\n",
    "    \n",
    "    def __init__(self):\n",
    "        super().__init__()\n",
    "        self.client = ZhipuAI(api_key=zhipuai_api_key)\n",
    "    \n",
    "    @property\n",
    "    def _llm_type(self):\n",
    "        return \"ChatGLM3\"\n",
    "    \n",
    "        \n",
    "    def _call(self,prompt,history=[],stop=[\"<|user|>\"]):\n",
    "        if history is None:\n",
    "            history=[]\n",
    "        history.append({\"role\":\"user\",\"content\":prompt})\n",
    "        response = self.client.chat.completions.create(\n",
    "            model=\"glm-4\",\n",
    "            messages=history\n",
    "        )\n",
    "\n",
    "        result = response.choices[0].message.content\n",
    "        return result\n",
    "        \n",
    "    def stream(self,prompt,history=[]):\n",
    "        if history is None:\n",
    "            history=[]\n",
    "        history.append({\"role\":\"user\",\"content\":prompt})\n",
    "        response = self.client.chat.completions.create(\n",
    "            model=\"glm-4\",\n",
    "            messages=history,\n",
    "            stream=True\n",
    "        )\n",
    "        for chunk in response:\n",
    "            yield chunk.choices[0].delta.content\n",
    "            \n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "a00020f1",
   "metadata": {},
   "outputs": [],
   "source": [
    "llm = ChatGLM4()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7f451b6c",
   "metadata": {},
   "source": [
    "1. 让大模型根据提示词拆分任务\n",
    "2. 按照可以使用的工具来进行拆分\n",
    "3. 定义有工具可以使用"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "f0fac133",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'description': '晴', 'temperature': '19'}"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from langchain.tools import BaseTool\n",
    "import requests\n",
    "\n",
    "class Weather(BaseTool):\n",
    "    name = \"weather\"\n",
    "    description = \"根据位置获取天气数据\"\n",
    "    \n",
    "    def __init__(self):\n",
    "        super().__init__()\n",
    "        \n",
    "    def get_weather(self,location):\n",
    "        api_key = \"SKcA5FGgmLvN7faJi\"\n",
    "        url = f\"https://api.seniverse.com/v3/weather/now.json?key={api_key}&location={location}&language=zh-Hans&unit=c\"\n",
    "        response = requests.get(url)\n",
    "        if response.status_code == 200:\n",
    "            data = response.json()\n",
    "            #print(data)\n",
    "            weather = {\n",
    "                'description':data['results'][0][\"now\"][\"text\"],\n",
    "                'temperature':data['results'][0][\"now\"][\"temperature\"]\n",
    "            }\n",
    "            return weather\n",
    "        else:\n",
    "            raise Exception(f\"失败接收天气信息：{response.status_code}\")\n",
    "    def _run(self,para):\n",
    "        return self.get_weather(para)\n",
    "            \n",
    "weather_tool = Weather()\n",
    "weather_tool.run(\"广州\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1e8f460e",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "pytorch",
   "language": "python",
   "name": "pytorch"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
